package com.example.stella;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.stella.activities.AddTransactionActivity;
import com.example.stella.activities.LoginActivity;
import com.example.stella.adapters.TransactionAdapter;
import com.example.stella.database.TransactionDAO;
import com.example.stella.models.Transaction;
import com.example.stella.utils.SessionManager;

import java.text.DecimalFormat;
import java.util.List;

/**
 * =================== 应用主框架 ===================
 * 主页面Activity - 显示收支概览和最近交易记录
 * 整体架构：数据声明 -> 视图初始化 -> 数据绑定 -> 事件监听 -> 数据实现
 */
public class MainActivity extends AppCompatActivity {
    
    // =================== 数据声明部分 ===================
    // UI组件声明
    private TextView tvBalance, tvIncome, tvExpense, tvViewAll;  // 显示金额和链接的文本视图
    private Button btnLogout, btnAddIncome, btnAddExpense;       // 功能按钮
    private RecyclerView rvTransactions;                         // 交易记录列表
    
    // 数据处理和适配器声明
    private TransactionAdapter adapter;      // 交易记录列表适配器
    private TransactionDAO transactionDAO;  // 交易数据访问对象
    private SessionManager sessionManager;  // 用户会话管理器
    private DecimalFormat currencyFormat;   // 货币格式化工具

    // =================== Activity生命周期框架 ===================
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 按顺序初始化各个模块
        initViews();        // 1. 初始化视图组件
        initData();         // 2. 初始化数据和检查状态
        setupListeners();   // 3. 设置事件监听器
        loadData();         // 4. 加载和显示数据
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 页面恢复时刷新数据 - 确保数据最新
        loadData();
    }

    // =================== 视图初始化部分 ===================
    /**
     * 数据绑定 - 将布局文件中的视图组件绑定到Java变量
     * 作用：建立UI组件与代码的连接关系
     */
    private void initViews() {
        // 绑定金额显示相关视图
        tvBalance = findViewById(R.id.tvBalance);   // 总余额显示
        tvIncome = findViewById(R.id.tvIncome);     // 收入金额显示
        tvExpense = findViewById(R.id.tvExpense);   // 支出金额显示
        tvViewAll = findViewById(R.id.tvViewAll);   // 查看全部链接
        
        // 绑定功能按钮
        btnLogout = findViewById(R.id.btnLogout);       // 退出登录按钮
        btnAddIncome = findViewById(R.id.btnAddIncome); // 添加收入按钮
        btnAddExpense = findViewById(R.id.btnAddExpense); // 添加支出按钮
        
        // 绑定交易记录列表
        rvTransactions = findViewById(R.id.rvTransactions); // 交易记录RecyclerView
    }

    // =================== 数据初始化部分 ===================
    /**
     * 数据声明和初始化 - 创建数据处理对象和检查应用状态
     * 作用：准备数据处理工具，验证用户登录状态
     */
    private void initData() {
        // 初始化数据处理工具
        sessionManager = new SessionManager(this);    // 用户会话管理
        transactionDAO = new TransactionDAO(this);    // 交易数据库操作
        currencyFormat = new DecimalFormat("¥#,##0.00"); // 货币格式化

        // 安全检查：验证用户登录状态
        if (!sessionManager.isLoggedIn()) {
            // 未登录则跳转到登录页面
            startActivity(new Intent(this, LoginActivity.class));
            finish();
            return;
        }

        // 数据绑定：设置交易记录列表
        rvTransactions.setLayoutManager(new LinearLayoutManager(this)); // 设置线性布局管理器
        adapter = new TransactionAdapter(this);     // 创建适配器
        rvTransactions.setAdapter(adapter);         // 绑定适配器到RecyclerView
    }

    // =================== 事件监听设置部分 ===================
    /**
     * 事件绑定 - 为UI组件设置用户交互事件监听器
     * 作用：响应用户的点击操作，执行相应的业务逻辑
     */
    private void setupListeners() {
        // 退出登录事件
        btnLogout.setOnClickListener(v -> {
            sessionManager.logoutUser();                               // 清除登录状态
            startActivity(new Intent(this, LoginActivity.class));      // 跳转到登录页
            finish();                                                   // 关闭当前页面
        });

        // 添加收入记录事件
        btnAddIncome.setOnClickListener(v -> {
            Intent intent = new Intent(this, AddTransactionActivity.class);
            intent.putExtra("type", "收入");    // 传递交易类型参数
            startActivity(intent);
        });

        // 添加支出记录事件
        btnAddExpense.setOnClickListener(v -> {
            Intent intent = new Intent(this, AddTransactionActivity.class);
            intent.putExtra("type", "支出");    // 传递交易类型参数
            startActivity(intent);
        });

        // 查看全部记录事件（待实现）
        tvViewAll.setOnClickListener(v -> {
            // TODO: 实现查看全部记录页面
        });
    }

    // =================== 数据实现部分 ===================
    /**
     * 数据实现 - 从数据库加载用户数据并更新UI显示
     * 作用：获取最新数据，计算统计信息，更新界面显示
     */
    private void loadData() {
        // 获取当前登录用户ID
        int userId = sessionManager.getUserId();
        
        // 数据计算：从数据库获取统计数据
        double balance = transactionDAO.getTotalBalance(userId);  // 计算总余额
        double income = transactionDAO.getTotalIncome(userId);    // 计算总收入
        double expense = transactionDAO.getTotalExpense(userId);  // 计算总支出

        // 数据显示：将计算结果格式化并显示在UI上
        tvBalance.setText(currencyFormat.format(balance));   // 更新余额显示
        tvIncome.setText(currencyFormat.format(income));     // 更新收入显示
        tvExpense.setText(currencyFormat.format(expense));   // 更新支出显示

        // 数据绑定：加载交易记录列表
        List<Transaction> transactions = transactionDAO.getTransactionsByUserId(userId); // 获取交易记录
        adapter.setTransactions(transactions);  // 将数据绑定到适配器，自动更新列表显示
    }
}